#include <chrono>
#include <QString>
#include <QTextStream>
#include <QFile>

namespace Tm {      // 该名字空间负责实现文字化计时器
    
    using namespace std::chrono;
    
    enum class State { not_start, run, stop };      // 计时器状态
    
    struct Negative_error {};       // 不存在负数的时间

    class Time {        // Time类是一个文字化计时器
    public:
        explicit Time(const QString& tm_str ="00:00:00", State st =State::not_start) : state{st} { parse_time(tm_str); }
        explicit Time(const QFile& message, State st =State::not_start) : state{st} { parse_time(message); }
        QString get_text() const;       // 获取格式化时间字符串
        void start();       // 开始计时
        void set_time();        // 刷新计时
        void stop() { state = State::stop; }
        bool running() const { return state==State::run; }
        bool operator>=(const QString& tm_str) const { return *this>=Time{tm_str}; }
        bool operator>=(const Time& otm) const;     // 比大小
        void operator-=(int msec);      // 自减
        Time operator-(int msec) const;     // 返回减去对应的毫秒数的新时间
    private:
        decltype(system_clock::now()) begin;
        State state;
        int ms;
        void parse_time(QString str);       // 从对应的字符串中获取时间。str必须是有效时间
        void parse_time(const QFile& message);      // 从对应的文件中获取时间
    };

}
